{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 分析用户表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取数据 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep = ';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#df_user['location'].unique()\n",
    "location_value_counts = df_user['location'].value_counts()\n",
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 平均每个地区存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum()/location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 把位置变为国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location   age\n",
       "0        1             usa   NaN\n",
       "1        2             usa  18.0\n",
       "2        3          russia   NaN\n",
       "3        4        portugal  17.0\n",
       "4        5  united kingdom   NaN"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'usa'"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#location='nyc, new york, usa'\n",
    "#location.rsplit(',',maxsplit=1)[-1].strip()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa                                         139711\n",
       "canada                                       21658\n",
       "united kingdom                               18538\n",
       "germany                                      17043\n",
       "spain                                        13147\n",
       "                                             ...  \n",
       "belgi                                            1\n",
       "queensland                                       1\n",
       "windham                                          1\n",
       "commonwealth of northern mariana islands         1\n",
       "sri lanka\\\"n/a\\\"\"                                1\n",
       "Name: location, Length: 709, dtype: int64"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts = df_user['location'].value_counts()\n",
    "location_value_counts"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(location_value_counts)),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()    \n",
    "].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()    \n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   278858 non-null  int64  \n",
      " 1   location  278858 non-null  object \n",
      " 2   age       168096 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age =df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x2027bb36850>]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD4CAYAAAAEhuazAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3dfXTc1X3n8fd3RqPR85Ml+UGyLQPmwdgGjHGcEmiahGBIGggtXdKT4Lbp8TksadNt9myh2Z6T7C55aLrdNm3CHhqymCaB0iZZKCcJUAc2gVBA5snYxlh+wBY2kixLtjSSZjQzd/+Y35jBjKSRNE+a+bzOmTM/3fn9Zu71yB9f39/93Z855xARkfLiK3QFREQk/xT+IiJlSOEvIlKGFP4iImVI4S8iUoYqCl2BmbS2trqurq5CV0NEZEHZuXPnCedc21SvF334d3V10d3dXehqiIgsKGb25nSva9hHRKQMKfxFRMqQwl9EpAwp/EVEypDCX0SkDCn8RUTKkMJfRKQMKfyz7MnX+9nfN1LoaoiITEvhn0XOOf74gZf43A9eIh7XfRJEpHgp/LOofyTMSDjKvr4RHt11vNDVERGZksI/iw70jwJQHfDzN//2BtFYvMA1EhFJT+GfRQcGEuH/Z1su4OBAiIdfPlbgGomIpKfwz6IDAyFqK/3c+v4u1ixt4G937FfvX0SKksI/iw4MjHJOWx0+n7Ht6nM4cnKMvcc180dEio/CP4sODoQ4t60WgCtWtQDw4pGhQlZJRCQthX+WjEdivDU8zrltdQAsa6yivT7ISwp/ESlCCv8sOXZqHIDlLTUAmBmXrWjipaPDhayWiEhaCv8sCYWjANRXvXNztMtWNPPm4BiDo+FCVUtEJC2Ff5aMeuFfU5kS/subAHj0VV3wJSLFReGfJWPhGAC1Qf+ZsstXNvNr5y7iy/+6m5/qil8RKSIK/ywJRRI9/9rgOz3/Cr+Pe7dewSXLm/izH75K3+mJQlVPRORdFP5ZEkr2/FOGfQCqK/389e9cSiQW57/9655CVE1E5D0U/lky5vX8a1KGfZJWtdZy/dqlvKyZPyJSJBT+WZI84Xt2zz+ppbaS4bFIPqskIjIlhX+WjEViVAV8+H2W9vXG6gChSIxIVGv9iEjhKfyzJBSOTtnrB2iqCQBwanwyX1USEZmSwj9LQuHou2b6nK2xphKAU+Ma+hGRwlP4Z0koEqOm8r0ne5OaqhM9/+Ex9fxFpPAU/lkSCkepm6bnnxz2UfiLSDHIKPzN7LCZ7TKzl82s2ytrMbMnzGy/99ycsv+dZtZjZvvM7NqU8su99+kxs2+aWfqzowtQKBKjZrphn2qN+YtI8ZhNz/83nHOXOuc2ej/fAexwzq0Gdng/Y2ZrgFuAi4EtwLfNLDkecjewDVjtPbbMvwnFYSwcpXbaYZ/EmP+wwl9EisB8hn1uALZ729uBG1PKH3TOhZ1zh4AeYJOZLQUanHPPOucccH/KMQveTCd866sqMINTmusvIkUg0/B3wONmttPMtnlli51zxwG853avvAM4mnJsr1fW4W2fXf4eZrbNzLrNrHtgYCDDKhZWKBKbtufv8xmN1QH1/EWkKEzdVX23K51zx8ysHXjCzF6fZt904/humvL3Fjp3D3APwMaNG9PuU2zGItFpx/whMeNHJ3xFpBhk1PN3zh3znvuBHwObgD5vKAfvud/bvRdYnnJ4J3DMK+9MU77ghaMxJmNu2tk+gHr+IlI0Zgx/M6s1s/rkNvBR4DXgEWCrt9tW4GFv+xHgFjMLmtkqEid2n/eGhkbMbLM3y+fWlGMWtORa/tPN84fEhV4a8xeRYpDJsM9i4MferMwK4AfOuZ+Z2QvAQ2b2WeAIcDOAc263mT0E7AGiwO3OuZj3XrcB9wHVwE+9x4J3ZlG3DIZ9jgyG8lElEZFpzRj+zrmDwCVpygeBD09xzF3AXWnKu4G1s69mcRuLpF/L/2xNNRr2EZHioCt8syA0zVr+qZqqA5wanyQeXxDnsEWkhCn8syDkDfvMeMK3phLnYGgswie//Qzf3LE/H9UTEXkPhX8WhDI84bt2WQMA9z59iJeODPMPvzx45nyBiEg+KfyzIHkLx5nG/Dd2tbCotpJ7fnEQgJGJKD/c2TvtMSIiuaDwz4ITo2EAmmsrp93P7zM+ctFionHHxpXNXLaiiW892UP/6Yl8VFNE5AyFfxYcOTlGY3XgzMqd09mydgkA16xZzF03rmM0HGXbP+7USWARySuFfxYcPTnO8pbqjPa9+vw2/vuNa/nd961gzbIG/vSa83n56DDH1fsXkTxS+GfB0aExljfXZLSv32d8ZvNK6qsS/0tY3pI4biikK39FJH8U/vMUjzt6T46fCfHZavHOEwxp2QcRySOF/zz1j4SJxOJzDv9m7/aOJ9XzF5E8UvjP09GhMQCWN2c25n+25hrvDl9a6llE8kjhP09HBr3wn2PPv7E6gJl6/iKSXwr/eTo6NIYZdDTNredf4ffRWB3QmL+I5JXCf556h8Zprw9SFZh+aYfptNRUqucvInml8J+nvtMTLGmcW68/qbm2Uj1/Eckrhf88DYyEaasLzus9mmsqORnSCV8RyR+F/zydGA3TVj+/8G+pDegiLxHJK4X/PERjcQZDkXmHf3NtJSfHIjin9X1EJD8U/vNwMhTBOeYf/jWVRKLxM7eDFBHJNYX/PPSPJJZynu+Yf0uNlngQkfxS+M/DgLeOfzaGfQCGdNJXRPJE4T8PA17Pvz0LJ3wBTqrnLyJ5ovCfh2T4t85z2Cd5vO7oJSL5ovCfh4GRMPXBCqpnuHH7TJY0VgFw/JTCX0TyQ+E/DwNZmOMPEKzw01Yf5NjweBZqJSIyM4X/PAyMhGnNQvgDLGuq5i2Fv4jkScbhb2Z+M3vJzB71fm4xsyfMbL/33Jyy751m1mNm+8zs2pTyy81sl/faN83Mstuc/BoYyU7PH6CjqUo9fxHJm9n0/D8P7E35+Q5gh3NuNbDD+xkzWwPcAlwMbAG+bWbJQfG7gW3Aau+xZV61L6DeoTEOnQhx8bKGrLzfssZqjg1P6CpfEcmLjMLfzDqBjwHfSSm+AdjubW8Hbkwpf9A5F3bOHQJ6gE1mthRocM496xIJd3/KMQvOT3YdB+Dj65Zl5f2WNVUzPhnTHb1EJC8y7fn/DfBfgHhK2WLn3HEA77ndK+8Ajqbs1+uVdXjbZ5e/h5ltM7NuM+seGBjIsIr59eirx1nf2ciKRXO7g9fZlnk3g9G4v4jkw4zhb2YfB/qdczszfM904/humvL3Fjp3j3Nuo3NuY1tbW4Yfmz9vn5rg1d5TfGzd0qy9Z/JOYBr3F5F8qMhgnyuBT5jZ9UAV0GBm3wP6zGypc+64N6TT7+3fCyxPOb4TOOaVd6YpX3D2948AsL6zKWvvuawpMddf4S8i+TBjz985d6dzrtM510XiRO7PnXOfBh4Btnq7bQUe9rYfAW4xs6CZrSJxYvd5b2hoxMw2e7N8bk05ZkE5fCIEwKrW2qy9Z0ttJcEKH8d0oZeI5EEmPf+pfA14yMw+CxwBbgZwzu02s4eAPUAUuN05l1yr+DbgPqAa+Kn3WHAOnghRHfCzuCE70zwBzIwOzfUXkTyZVfg7554CnvK2B4EPT7HfXcBdacq7gbWzrWSxOXwiRFdrLdm+TGFZU7WGfUQkL3SF7xwcHhxjVWt2ZvmkWqYLvUQkTxT+sxSNxTl6coyuRdkb709a1lRN/0iYSDQ+884iIvOg8J+l3qFxonFHVxZP9iYta6rGOejT0s4ikmMK/1k6NJiY6XNODsK/Qxd6iUieKPxn6fhwolfe0Vyd9fdepgu9RCRPFP6zNBpOrL1TXxXI+nsvbdSFXiKSHwr/WRqdiGIGNYH53b0rnaqAn9a6St4a1pi/iOSWwn+WRsJR6ior8PlycysCzfUXkXxQ+M/S6ESUuqr5XBg9vc7mat70TiqLiOSKwn+WRsNR6oK5C/+LlzVyeHCMU+Na119EckfhP0uj4dz2/Nd3NgKwq/dUzj5DREThP0sjE7nt+a/vSCwT/UrvcM4+Q0RE4T9LoXCU+hz2/BtrAnQtqlHPX0RySuE/S7ke84fETWJeVc9fRHJI4T9LoxNR6oLZv8Ar1frORo6dmmBgJJzTzxGR8qXwn4V43DEaye0JX3jn9pDq/YtIrij8Z2FsMoZzUJ/jYZ+1HQ34DF7RuL+I5IjCfxZGJ6IAOe/511RWsLq9Xj1/EckZhf8sJBd1y/UJX0iM++/qPYVzLuefJSLlR+E/CyPJnn+ewn8wFNHa/iKSEwr/WRgN52fYB+DS5c0A/PvBkzn/LBEpPwr/WRjNY89/bUcDXYtq+Ofuozn/LBEpPwr/WRgJ5y/8zYzfuWI5zx06ycGB0Zx/noiUF4X/LCR7/rlc3iHVb2/oxO8z/u9Lb+Xl80SkfCj8ZyE55l+bh54/QHtDFee11bH72Om8fJ6IlI8Zw9/MqszseTN7xcx2m9mXvfIWM3vCzPZ7z80px9xpZj1mts/Mrk0pv9zMdnmvfdPMcnM7rBwZDUepCvgI+PP3b+Z57XX0aNhHRLIskxQLAx9yzl0CXApsMbPNwB3ADufcamCH9zNmtga4BbgY2AJ828ySN7y9G9gGrPYeW7LYlpxLLOqW23V9znZuex1HT44xMRnL6+eKSGmbMfxdQrLrGfAeDrgB2O6Vbwdu9LZvAB50zoWdc4eAHmCTmS0FGpxzz7rElUv3pxyzIJwan6QhT+P9Savb64g7OHRCt3YUkezJaPzCzPxm9jLQDzzhnHsOWOycOw7gPbd7u3cAqfMTe72yDm/77PIFY3gsQnNtZV4/87z2OgB6+jX0IyLZk1H4O+dizrlLgU4Svfi10+yebhzfTVP+3jcw22Zm3WbWPTAwkEkV8+JkaJLmmvwO+6xqrcVnsF/hLyJZNKszl865YeApEmP1fd5QDt5zv7dbL7A85bBO4JhX3pmmPN3n3OOc2+ic29jW1jabKubU8FiEppr89vyrAn6Wt9RwQOEvIlmUyWyfNjNr8rargY8ArwOPAFu93bYCD3vbjwC3mFnQzFaROLH7vDc0NGJmm71ZPremHLMgDI1FaMnzsA/A6vZ6Xn9b0z1FJHsyOXu5FNjuzdjxAQ855x41s2eBh8zss8AR4GYA59xuM3sI2ANEgdudc8mpKrcB9wHVwE+9x4IwHokxMRmnKc/DPgCXLm/k3/b2cWpsksYCfL6IlJ4Zw9859ypwWZryQeDDUxxzF3BXmvJuYLrzBUVraCwCQEueh30ANqxIXELx0tEhPnhB+wx7i4jMTFf4ZigZ/vke8we4ZHkTPoOn9g3wPx7dQ9/pibzXQURKS34nrS9gQ6HEjVzyPdsHEstJXLCkgft+dRiA4fFJ/urmS/JeDxEpHer5Z+jMsE8BTvgCbFiRuKl7a12QH73Yq4u+RGReFP4ZKuSwD8BNGzr46JrF/PC291Ph8/HA80cKUg8RKQ0a9slQctinELN9AC5f2cI9t7YAsHpxHfveHilIPUSkNKjnn6GhsQj1VRV5XdFzKue112m5BxGZl8In2QIxNBahuUBDPmc7t62Ot4bHGY9opU8RmRuFf4aGxvK/rs9Ukou9HdA6/yIyRwr/DBViRc+pnNum8BeR+VH4Z+jESLggV/em09Vag8/QYm8iMmea7ZOBU2OTHDs1wXmL6wpdFQCCFX5WtNTw2O4+wtE4H1+/jHWdjYWulogsIOr5Z2D38VMAXLyseAJ2fWcT+/pGuPfpQ3ziW0/z4pGhQldJRBYQhX8G9hxLLKd88bKGAtfkHd+4eT0v/cU1PHPHh3AOXjh0kreGx3lzUFf+isjMNOyTgd3HTrOkoYrWumChq3JGsMJPsMIPwOKGIPv6RnjqoVfoG5ng51/4YGErJyJFT+GfgdfeOlVUvf6znb+4nj3HTnPoRIhwNM7BgVHOaSuO8xMiUpw07DOD8UiMAwOjRR3+Fyyu5/W3RwhH4wD8/PX+GY4QkXKn8J/BW8NjxB2c2168Penzl9Sf2V7cEGTHXoW/iExP4T+DwdHEap5tRTTef7YLFifCv6Opmps2dPLC4ZOMTEwWuFYiUswU/jMYDHnr+NcVxwVe6az2rj+4fGUzv35+G9G449kDgwWulYgUM4X/DAZHwwAsqi3enn9NZQVf/sTFbLv6HDasaKam0s8v958odLVEpIhpts8MToxGMCvM7RtnY+uvdZ3Z3nzOIp7uUfiLyNTU85/BYChMc00lFUWwjn+mrlrdyqETIY6eHCt0VUSkSC2cRCuQwdEIi4pkNc9MXbW6DUBDPyIyJYX/DAZDkYLdtH2uzm2rZVljFb/cPwBAPO444Z27EBEBhf+MBkfDRbWsQybMjKtWt/FMzwmisTh/+dg+PviNp5iY1J2/RCRB4T+DwVCERUU8zXMqV53fyumJKI/v6eO7zxxiNBzVOQAROWPG8Dez5Wb2pJntNbPdZvZ5r7zFzJ4ws/3ec3PKMXeaWY+Z7TOza1PKLzezXd5r3zQzy02zsmMyFmd4bLKop3lO5cpzWzGDzz/4EhFv2YfDgwp/EUnIpOcfBb7gnLsI2AzcbmZrgDuAHc651cAO72e8124BLga2AN82M7/3XncD24DV3mNLFtuSdUPeBV4LseffXFvJ3/yHS/ntyzv58+svBODwCS33LCIJM4a/c+64c+5Fb3sE2At0ADcA273dtgM3ets3AA8658LOuUNAD7DJzJYCDc65Z51zDrg/5ZiidMJb2qF1AYY/wA2XdvDVm9az7epzaaoJcFhr/YuIZ1Zj/mbWBVwGPAcsds4dh8Q/EEC7t1sHcDTlsF6vrMPbPrs83edsM7NuM+seGBiYTRWz6mRyaYcFOOxztpWLanlTwz4i4sk4/M2sDvgh8CfOudPT7ZqmzE1T/t5C5+5xzm10zm1sa2vLtIpZNxhKTI9caFM90+laVKOev4ickVH4m1mARPB/3zn3I6+4zxvKwXtOriPcCyxPObwTOOaVd6YpL1qhcGJqZF1w4a+CsXJRLceGxwlHNd1TRDKb7WPAvcBe59xfp7z0CLDV294KPJxSfouZBc1sFYkTu897Q0MjZrbZe89bU44pSsmgrAos/BmxXYtqiDvoHRonHnckTruISLnKpEt7JfAZYJeZveyV/TnwNeAhM/sscAS4GcA5t9vMHgL2kJgpdLtzLtndvA24D6gGfuo9itbEZGKKZPJeuQtZV2stAAcHQvz9z3uYjMX5+9/dUOBaiUihzBj+zrmnST9eD/DhKY65C7grTXk3sHY2FSykZM8/WLHwe/7nL67HDPYeP80v9w8syGsXRCR7Fv5gdg5NTMap9Pvw+Yr6WrSM1AUr6FpUy1P7+jkxGqHCt/D/QRORuVMCTCMcjREsgfH+pIuW1vPikWEATus2jyJlrXSSLQcmJuMlMd6ftGZpw5ntsUiMyVi8gLURkUJS+E8jHI2VxEyfpItSwh/g9Lh6/yLlqnSSLQfCk3GqAiXU81+WCP+AP3EO4/REtJDVEZECUvhPIxyNlcRMn6QlDVVct3YJv7Uhca3dKfX8RcpW6SRbDkyUWM/fzLj705fzW5cnwl/DPiLlS+E/jVLr+Sc1VgcAzfgRKWell2xZVGo9/6SGqkT4a9hHpHwp/KdR8j3/cZ3wFSlXpZdsWVSqPf+qgI+A3zTsI1LGFP7TKNWev5nRWB3QsI9IGSu9ZMuiUu35Q2LcX7N9RMqXwn8apdrzB2hQz1+krJVmsmWBcy6xtk+p9vyrA7rCV6SMKfynEIklb+RSmn9EjdUBRtTzFylbpZlsWZC8i1fpjvlXaNhHpIwp/KdQSnfxSic520f38hUpT6WZbFkQLvGe/8pFNUTjjtffHil0VUSkABT+Uyj1nv+HLlyMGTy+u6/QVRGRAijNZMuCUh/zb6sPcvmKZh7b/XahqyIiBaDwn8LEZGn3/AGuvXgJe46f5ujJsUJXRUTyrHSTbZ7C0dLu+QNct24JPoPvP3ek0FURkTxT+E+hHHr+nc01bFm7hB889yajYV3wJVJOSjfZ5qkcev4Af3jVOZyeiPLP3UcLXRURySOF/xTKoecPsGFFM5csb+IHzx3RnH+RMjJjspnZd82s38xeSylrMbMnzGy/99yc8tqdZtZjZvvM7NqU8svNbJf32jfNzLLfnOwpl54/wO9uWs7+/lF2vjlU6KqISJ5k0q29D9hyVtkdwA7n3Gpgh/czZrYGuAW42Dvm22aWTM+7gW3Aau9x9nsWlWTPvypQ2j1/gI+vX0ZdsIIHntfQj0i5mDHZnHO/AE6eVXwDsN3b3g7cmFL+oHMu7Jw7BPQAm8xsKdDgnHvWJcYW7k85pigle/7BitLv+dcGK/jIRe38Yv+Ahn5EysRcu7WLnXPHAbzndq+8A0jtPvZ6ZR3e9tnlaZnZNjPrNrPugYGBOVZxfsplzD/pilUtDIyEOaI5/yJlIdvJlm4c301TnpZz7h7n3Ebn3Ma2trasVW42wtE4lX4fPl9Rn5rImiu6WgB44bDG/UXKwVzDv88bysF77vfKe4HlKft1Ase88s405UVrYjJGsAzG+5POa6ujsTpA9+GzR/hEpBTNNd0eAbZ621uBh1PKbzGzoJmtInFi93lvaGjEzDZ7s3xuTTmmKIWj8bIY70/y+YyNK5t5QeEvUhYymer5APAscIGZ9ZrZZ4GvAdeY2X7gGu9nnHO7gYeAPcDPgNudczHvrW4DvkPiJPAB4KdZbktWjUdiVFeWT88fYPM5izgwEOLAwGihqyIiOVYx0w7OuU9N8dKHp9j/LuCuNOXdwNpZ1a6ARsNRaitn/OMpKTdctoyv/+x1Hnz+CF/82JpCV0dEcqi8urazEApHqQuWV/i311dxzZrF/MvO3jP3MxCR0qTwn0IoHKWuqrzCH+CWTSsYGpvkydf7Z95ZRBYshf8URsJRasus5w/wa+cuoqkmwGO6w5dISVP4TyEUjlJXZmP+AAG/j2suWsy/7e0j4l3lLCKlR+E/hVA4VpY9f4Ata5cwMhHl2YODha6KiOSIwj+NeNwxWqZj/gBXntdKfbCCH7/YO/POIrIgKfzTGPPW9akLls9FXqmqAn5u2tDBT3a9zeBouNDVEZEcUPinEfJuaViuwz4An968kkgszj/pDl8iJUnhn0byfrblNs8/1erF9XzgvFb+91MHOKqVPkVKjsI/jdEJr+dfhrN9Un3lk+twDv7ogZeIx7XOv0gpUfinkRz2KdcTvkkrFtXwF7+5hpePDvP/3ijMfRVEJDcU/mlo2Ocdn7ysgyUNVfzDLw8WuioikkUK/zRGdcL3jIDfx+9d2cWvDgzy5D4t+SBSKkoy/J1zvP72aV5769Scjn9ntk95TvU822c2r+SipQ38x++9yKu9w4WujohkQUmGv5mx7f6d/K8n3pjT8aPhxDz/+mAgm9VasGqDFWz/gytorgnwn/7p5TP3NxaRhaskwx/g189v41cHBue0NHEoHMVnUFVGt3GcSXt9FV+5aR0HBkJ868meQldHROapZNPt189vY3wyxs453JB81FvRM3HHSUn64AXt3LShg7ufOsDe46cLXR0RmYeSDf/3n7uIgN/mNEVxtAxv5JKpv/jYGhqrA3zhoVcYCkUKXR0RmaOSDf/aYAUbV7bMKfzL8S5emWqureQbN6+nZ2CUT3zrafpPTxS6SiIyByUb/gDvO6eFfX0jZ6ZuZmq0TG/kkqkPXbiYB7dtpu9UmL98bF+hqyMic1DS4b+uoxHnmPX4tIZ9ZrZhRTO//4Eu/mVnL7/qOVHo6ojILJV0+K/taASY9Xz/UDiqOf4Z+NxvnMfylmo+fe9zfP1nrxMrsvV/nHM8+uoxRiYmC10VkaJT0uHfXh+ktS7IrlmE/9unJjg8OEZHU00Oa1Ya6qsC/OSPr+Lmy5dz91MHuO17O4vqH4A9x0/zuR+8xD+9oGWpRc5W0uFvZqzraGD3W5kP+9z9VA/xuOP3r+zKXcVKSH1VgK//9nq+eP1FPL6nj3t+UTxrAD3jDUfN9UpvkVJW0uEPiaGf/f0jjEdmvthr55tDPPD8UW7e2MnyFvX8Z+MPr1rF9euW8FeP7+M3/+5pfvba8UJXiad7Evcg3qNrEkTeo+TDf2NXC3EHP5zhfrRP7Onj9777PMuaqvjTay7IU+1Kh5nx1ZvW8wdXdhGJxrnt+y/ypUd286sDJ4hE43mvTzga44VDJ6nwGQcGQlqSQuQseZ/SYmZbgL8F/MB3nHNfy+XnXb26lfetauEbj+3jwxe1s7Sx+sxr4WiMv9vRw892v01P/ygXLK7n//z+FbTVB3NZpZLVWB3gix9bwxc+GuPPf7SL7/37m9z3q8PUBSv42LqlXLi0niu6Ws6ciM+lFw4NMT4Z46YNHfzoxbd4o2+E9Z1NOf9ckYXCnMvfCToz8wNvANcAvcALwKecc3umOmbjxo2uu7t7Xp/7Rt8IH/+7pzHgshVNLGmoYnlLDU/s6eP1t0e4+vw2PnJRO5/atIKAv+T/M5Q3IxOTPHtgkMf39PGTXccZ84befuOCNlrrgtQGK1jSWMXaZY1cuqKJSr8Pv8/wWeJ/EsNjEXr6R6ms8DE0Nsmi2krWLG3A50u/7IZzjkgsjnNw47eeYTAU4f4/2MR1f/tLvnrTOj61aUXW2uacY2IyzmQ8Tl1lxZR1EikUM9vpnNs45et5Dv/3A19yzl3r/XwngHPuq1Mdk43wBzg4MMp3nj7E/r4Rjpwco+90mAuX1PMnHzmfLWuXzPv9ZXrRWJyToQj3PnOIJ/b0MR6JMRqOMjKR/gI8v8/SzhyqC1bQWldJzDki0TjRmCPmHNGYYywSJe7AZxB38N3f28gHz2/nki8/ngjpYAV1wQrGJ2P4zQgG/PgMnIO4S7zPyESU8GScqoCPsUiMgN9HVcBPVcBHwO9jLBJlLBwj5H1Wsq7BCh/BCh+VyYffd2ZtqOTfsXe1xr13M/Xv4jtlqfu988Nk1DE8HsFvduYzgxV+An7DpzWpSsajf/wBghVzm3Y+U/jne9inA0idd9cLvO/sncxsG7ANYMWK7PTWzmmr4yufXAck/pKFo3GqAprLn28ESRAAAASzSURBVC8Vfh/tDVXced1F3HndRWfKT41PsvPNk7zRN0os7ojFHdG4Ix531AYruHBJPbG4o7EmwJHBMXa9dYoTo2EC/kTAVviNCp/h9/moqUyEdCgSY1lTNR+6cDEA//XjF/Hy0VOYwchElOqAj7iDSDROLO7wef/b8JlRF6wgWOEjHI1TXeknGnOMT8YIT8aIxOLUVPqpDVZQW1lBbbCCCp8xPB5hYjJOJOo9YvH3nuewdz0ltlNC2s6UveeQd+2bLKvwG001lcTi7sznhqMxJmPuXf9IyMJm5O4f8nz3/G8GrnXO/aH382eATc65P5rqmGz1/EVEyslMPf98D3D3AstTfu4EjuW5DiIiZS/f4f8CsNrMVplZJXAL8Eie6yAiUvbyOubvnIua2eeAx0hM9fyuc253PusgIiIFmOfvnPsJ8JN8f66IiLxDk9pFRMqQwl9EpAwp/EVEypDCX0SkDOX1Iq+5MLMB4M05Ht4KlOM9Bsu13VC+bVe7y89MbV/pnGub6sWiD//5MLPu6a5wK1Xl2m4o37ar3eVnvm3XsI+ISBlS+IuIlKFSD/97Cl2BAinXdkP5tl3tLj/zantJj/mLiEh6pd7zFxGRNBT+IiJlqCTD38y2mNk+M+sxszsKXZ9cM7PDZrbLzF42s26vrMXMnjCz/d5zc6HrOV9m9l0z6zez11LKpmynmd3p/Q7sM7NrC1Pr7Jii7V8ys7e87/1lM7s+5bWSaLuZLTezJ81sr5ntNrPPe+Ul/b1P0+7sfefOuZJ6kFgq+gBwDlAJvAKsKXS9ctzmw0DrWWV/Cdzhbd8BfL3Q9cxCO68GNgCvzdROYI333QeBVd7vhL/Qbchy278E/Oc0+5ZM24GlwAZvux54w2tfSX/v07Q7a995Kfb8NwE9zrmDzrkI8CBwQ4HrVAg3ANu97e3AjQWsS1Y4534BnDyreKp23gA86JwLO+cOAT0kfjcWpCnaPpWSabtz7rhz7kVvewTYS+Je4CX9vU/T7qnMut2lGP7pbhI/3R9aKXDA42a208y2eWWLnXPHIfGLBLQXrHa5NVU7y+X34HNm9qo3LJQc+ijJtptZF3AZ8Bxl9L2f1W7I0ndeiuGf7nb3pT6f9Urn3AbgOuB2M7u60BUqAuXwe3A3cC5wKXAc+J9eecm13czqgB8Cf+KcOz3drmnKFmzb07Q7a995KYZ/2d0k3jl3zHvuB35M4r97fWa2FMB77i9cDXNqqnaW/O+Bc67PORdzzsWBf+Cd/+aXVNvNLEAiAL/vnPuRV1zy33u6dmfzOy/F8C+rm8SbWa2Z1Se3gY8Cr5Fo81Zvt63Aw4WpYc5N1c5HgFvMLGhmq4DVwPMFqF/OJMPP80kS3zuUUNvNzIB7gb3Oub9Oeamkv/ep2p3V77zQZ7VzdKb8ehJnxw8AXyx0fXLc1nNInOV/BdidbC+wCNgB7PeeWwpd1yy09QES/9WdJNHT+ex07QS+6P0O7AOuK3T9c9D2fwR2Aa96f/mXllrbgQ+QGL54FXjZe1xf6t/7NO3O2neu5R1ERMpQKQ77iIjIDBT+IiJlSOEvIlKGFP4iImVI4S8iUoYU/iIiZUjhLyJShv4/sisgwzioiNEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age    \n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0 #年龄有误\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1  #少儿\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2 #青少年\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3 #青年\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4 #中年\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5 #老年\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep = ';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149780 non-null  int64  \n",
      " 1   item_id  1149780 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 商品流行度分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int64 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 48.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int32 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int32 \n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n",
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 保存新表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle\n",
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "         user_id location  age     item_id  rating\n",
      "0              2      usa    3  0195153448       0\n",
      "1              7      usa    0   034542252       0\n",
      "2              8   canada    0  0002005018       5\n",
      "3              8   canada    0  0060973129       0\n",
      "4              8   canada    0  0374157065       0\n",
      "...          ...      ...  ...         ...     ...\n",
      "1149767   278854      usa    0  0425163393       7\n",
      "1149768   278854      usa    0  0515087122       0\n",
      "1149769   278854      usa    0  0553275739       6\n",
      "1149770   278854      usa    0  0553578596       0\n",
      "1149771   278854      usa    0  0553579606       8\n",
      "\n",
      "[1149772 rows x 5 columns]\n"
     ]
    }
   ],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/df_data.pkl','rb')\n",
    ")\n",
    "print(object1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "object1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
